# -*- coding: utf-8 -*-
class Direction:
    '''
2048游戏方向操作类
游戏棋盘为16个元素的一维数组,0表示没有数字
每个方向四个列
    '''
    def __init__(self, start, small, big):
        '''
@start 第一列的起点下标
@small 列内下标步长
@big 列间下标步长
@self.lines 四个元素的列表,每个元素对应一列,存储该列在棋盘数组中的下标
        '''
        self.lines = [[j*big+start+small*i for i in range(4)] for j in range(4)]
    def move(self, matrix):
        '''
@matrix 被移动的棋盘,16个元素的一维数组,0表示该为知没有数字
@return 成功移动返回True,不可移动返回False
算法描述:
1.对一列中的四个数字逐一处理(通过下标i遍历)
2.下标io表示待归并的数位或待填数的空位(依据该位置是否为零区分)
3.第一次遇到一个数,该数就是待归并数,如果在此之前有空位,则把该数放到最早的空位上
'''
        success = False
        for line in self.lines:
            io = 3
            for i in [3,2,1,0]:  # 逐位处理
                if matrix[line[i]] > 0 and i < io: # 当前位置有数,而且不同于待归并位或待填数位                    
                    if matrix[line[io]] == 0:
                        matrix[line[io]] = matrix[line[i]]
                        matrix[line[i]] = 0
                        success = True
                    elif matrix[line[i]] == matrix[line[io]]:
                        matrix[line[io]] *= 2
                        matrix[line[i]] = 0
                        io -= 1
                        success = True
                    else:
                        io -= 1
                        if io > i:
                            matrix[line[io]] = matrix[line[i]]
                            matrix[line[i]] = 0
                            success = True
        return success                

                                        
def output(m):
    w = len(str(max(m))) 
    for i in range(4):
        print ('+' + '-' * (w +1)) * 4 + '+'
        for j in range(4):
            print '|{0:>{1}}'.format(m[i*4+j], w) ,
        print '|'
    print ('+' + '-' * (w +1)) * 4 + '+'

import random
m0 = [ x if x > 1 else 0 for x in [2**random.randint(0, 4) for i in range(16)]]

up = Direction(12, -4, 1)
down = Direction(0, 4, 1)
left = Direction(3, -1, 4)
right = Direction(0, 1, 4)


print '-------UP-------'
m = [x for x in m0]
output(m)
up.move(m)
output(m)
print ''

print '-------DOWN-------'
m = [x for x in m0]
output(m)
down.move(m)
output(m)
print ''

print '-------LEFT-------'
m = [x for x in m0]
output(m)
left.move(m)
output(m)
print ''

print '-------RIGHT-------'
m = [x for x in m0]
output(m)
right.move(m)
output(m)



